<?php namespace Modules\Shop\Http\Controllers;


class SearchController extends Controller {

    public function getIndex()
    {
        global $_CFG, $ecs, $err, $smarty, $_LANG, $db;

        if (empty($_GET['encode'])) {
            $string = array_merge($_GET, $_POST);
            if (get_magic_quotes_gpc()) {
                //require(dirname(__FILE__) . '/includes/lib_base.php');
                //require(dirname(__FILE__) . '/includes/lib_common.php');

                $string = stripslashes_deep($string);
            }
            $string['search_encode_time'] = time();
            $string = str_replace('+', '%2b', base64_encode(serialize($string)));

            header("Location: search.php?encode=$string\n");

            exit;
        } else {
            $string = base64_decode(trim($_GET['encode']));
            if ($string !== false) {
                $string = unserialize($string);
                if ($string !== false) {
                    /* 用户在重定向的情况下当作一次访问 */
                    if (!empty($string['search_encode_time'])) {
                        if (time() > $string['search_encode_time'] + 2) {
                            define('INGORE_VISIT_STATS', true);
                        }
                    } else {
                        define('INGORE_VISIT_STATS', true);
                    }
                } else {
                    $string = array();
                }
            } else {
                $string = array();
            }
        }

        //require(dirname(__FILE__) . '/includes/init.php');

        $_REQUEST = array_merge($_REQUEST, addslashes_deep($string));

        \Input::merge(['act' => \Input::get('act') ? trim(\Input::get('act')) : '']);

        /*------------------------------------------------------ */
//-- 高级搜索
        /*------------------------------------------------------ */
        if (\Input::get('act') == 'advanced_search') {
            $goods_type = \Input::get('goods_type') ? intval(\Input::get('goods_type')) : 0;
            $attributes = get_seachable_attributes($goods_type);
            \Tpl::assign('goods_type_selected', $goods_type);
            \Tpl::assign('goods_type_list', $attributes['cate']);
            \Tpl::assign('goods_attributes', $attributes['attr']);

            assign_template();
            assign_dynamic('search');
            $position = assign_ur_here(0, $_LANG['advanced_search']);
            \Tpl::assign('page_title', $position['title']);    // 页面标题
            \Tpl::assign('ur_here', $position['ur_here']);  // 当前位置

            \Tpl::assign('categories', get_categories_tree()); // 分类树
            \Tpl::assign('helps', get_shop_help());       // 网店帮助
            \Tpl::assign('top_goods', get_top10());           // 销售排行
            \Tpl::assign('promotion_info', get_promotion_info());
            \Tpl::assign('cat_list', cat_list(0, 0, true, 2, false));
            \Tpl::assign('brand_list', get_brand_list());
            \Tpl::assign('action', 'form');
            \Tpl::assign('use_storage', $_CFG['use_storage']);

            \Tpl::display('search.dwt');

            exit;
        }
        /*------------------------------------------------------ */
//-- 搜索结果
        /*------------------------------------------------------ */
        else {
            \Input::merge([
                'keywords' => \Input::get('keywords') ? htmlspecialchars(trim(\Input::get('keywords'))) : '',
            'brand'=> \Input::get('brand') ? intval(\Input::get('brand')) : 0,
            'category'=> \Input::get('category') ? intval(\Input::get('category')) : 0,
            'min_price'=> \Input::get('min_price') ? intval(\Input::get('min_price')) : 0,
            'max_price'=> \Input::get('max_price') ? intval(\Input::get('max_price')) : 0,
            'goods_type'=> \Input::get('goods_type') ? intval(\Input::get('goods_type')) : 0,
            'sc_ds'=> \Input::get('sc_ds') ? intval(\Input::get('sc_ds')) : 0,
            'outstock'=> \Input::get('outstock') ? 1 : 0
                ]);

            $action = '';
            if (is_set(\Input::get('action')) && \Input::get('action') == 'form') {
                /* 要显示高级搜索栏 */
                $adv_value['keywords'] = htmlspecialchars(stripcslashes(\Input::get('keywords')));
                $adv_value['brand'] = \Input::get('brand');
                $adv_value['min_price'] = \Input::get('min_price');
                $adv_value['max_price'] = \Input::get('max_price');
                $adv_value['category'] = \Input::get('category');

                $attributes = get_seachable_attributes(\Input::get('goods_type'));

                /* 将提交数据重新赋值 */
                foreach ($attributes['attr'] AS $key => $val) {
                    if (\Input::get('attr')[ $val['id'] ]) {
                        if ($val['type'] == 2) {
                            $attributes['attr'][ $key ]['value']['from'] = \Input::get('attr')[ $val['id'] ]['from']? htmlspecialchars(stripcslashes(trim(\Input::get('attr')[ $val['id'] ]['from']))) : '';
                            $attributes['attr'][ $key ]['value']['to'] = \Input::get('attr')[ $val['id'] ]['to']? htmlspecialchars(stripcslashes(trim(\Input::get('attr')[ $val['id'] ]['to']))) : '';
                        } else {
                            $attributes['attr'][ $key ]['value'] = \Input::get('attr')[ $val['id'] ]? htmlspecialchars(stripcslashes(trim(\Input::get('attr')[ $val['id'] ]))) : '';
                        }
                    }
                }
                if (\Input::get('sc_ds')) {
                    \Tpl::assign('scck', 'checked');
                }
                \Tpl::assign('adv_val', $adv_value);
                \Tpl::assign('goods_type_list', $attributes['cate']);
                \Tpl::assign('goods_attributes', $attributes['attr']);
                \Tpl::assign('goods_type_selected', \Input::get('goods_type'));
                \Tpl::assign('cat_list', cat_list(0, $adv_value['category'], true, 2, false));
                \Tpl::assign('brand_list', get_brand_list());
                \Tpl::assign('action', 'form');
                \Tpl::assign('use_storage', $_CFG['use_storage']);

                $action = 'form';
            }

            /* 初始化搜索条件 */
            $keywords = '';
            $tag_where = '';
            if (\Input::get('keywords')) {
                $arr = array();
                if (stristr(\Input::get('keywords'), ' AND ') !== false) {
                    /* 检查关键字中是否有AND，如果存在就是并 */
                    $arr = explode('AND', \Input::get('keywords'));
                    $operator = " AND ";
                } elseif (stristr(\Input::get('keywords'), ' OR ') !== false) {
                    /* 检查关键字中是否有OR，如果存在就是或 */
                    $arr = explode('OR', \Input::get('keywords'));
                    $operator = " OR ";
                } elseif (stristr(\Input::get('keywords'), ' + ') !== false) {
                    /* 检查关键字中是否有加号，如果存在就是或 */
                    $arr = explode('+', \Input::get('keywords'));
                    $operator = " OR ";
                } else {
                    /* 检查关键字中是否有空格，如果存在就是并 */
                    $arr = explode(' ', \Input::get('keywords'));
                    $operator = " AND ";
                }

                $keywords = 'AND (';
                $goods_ids = array();
                foreach ($arr AS $key => $val) {
                    if ($key > 0 && $key < count($arr) && count($arr) > 1) {
                        $keywords .= $operator;
                    }
                    $val = mysql_like_quote(trim($val));
                    $sc_dsad = \Input::get('sc_ds') ? " OR goods_desc LIKE '%$val%'" : '';
                    $keywords .= "(goods_name LIKE '%$val%' OR goods_sn LIKE '%$val%' OR keywords LIKE '%$val%' $sc_dsad)";

                    $sql = 'SELECT DISTINCT goods_id FROM ' . $ecs->table('tag') . " WHERE tag_words LIKE '%$val%' ";
                    $res = $db->query($sql);
                    while ($row = $db->FetchRow($res)) {
                        $goods_ids[] = $row['goods_id'];
                    }

                    $db->autoReplace($ecs->table('keywords'), array('date'         => local_date('Y-m-d'),
                                                                    'searchengine' => 'ecshop', 'keyword' => addslashes(str_replace('%', '',
                            $val)), 'count'                                        => 1), array('count' => 1));
                }
                $keywords .= ')';

                $goods_ids = array_unique($goods_ids);
                $tag_where = implode(',', $goods_ids);
                if (!empty($tag_where)) {
                    $tag_where = 'OR g.goods_id ' . db_create_in($tag_where);
                }
            }

            $category = \Input::get('category') ? intval(\Input::get('category')) : 0;
            $categories = ($category > 0) ? ' AND ' . get_children($category) : '';
            $brand = \Input::get('brand') ? " AND brand_id = '\Input::get(brand)'" : '';
            $outstock = \Input::get('outstock')? " AND g.goods_number > 0 " : '';

            $min_price = \Input::get('min_price') != 0 ? " AND g.shop_price >= '\Input::get(min_price)'" : '';
            $max_price = \Input::get('max_price') != 0 || \Input::get('min_price') < 0 ? " AND g.shop_price <= '\Input::get(max_price)'" : '';

            /* 排序、显示方式以及类型 */
            $default_display_type = $_CFG['show_order_type'] == '0' ? 'list' : ($_CFG['show_order_type'] == '1' ? 'grid' : 'text');
            $default_sort_order_method = $_CFG['sort_order_method'] == '0' ? 'DESC' : 'ASC';
            $default_sort_order_type = $_CFG['sort_order_type'] == '0' ? 'goods_id' : ($_CFG['sort_order_type'] == '1' ? 'shop_price' : 'last_update');

            $sort = (is_set(\Input::get('sort')) && in_array(trim(strtolower(\Input::get('sort'))),
                    array('goods_id', 'shop_price', 'last_update'))) ? trim(\Input::get('sort')) : $default_sort_order_type;
            $order = (is_set(\Input::get('order')) && in_array(trim(strtoupper(\Input::get('order'))),
                    array('ASC', 'DESC'))) ? trim(\Input::get('order')) : $default_sort_order_method;
            $display = (is_set(\Input::get('display')) && in_array(trim(strtolower(\Input::get('display'))),
                    array('list', 'grid', 'text'))) ? trim(\Input::get('display')) : (isset($_SESSION['display_search']) ? $_SESSION['display_search'] : $default_display_type);

            $_SESSION['display_search'] = $display;

            $page = \Input::get('page') && intval(\Input::get('page')) > 0 ? intval(\Input::get('page')) : 1;
            $size = !empty($_CFG['page_size']) && intval($_CFG['page_size']) > 0 ? intval($_CFG['page_size']) : 10;

            $intromode = '';    //方式，用于决定搜索结果页标题图片

            if (\Input::get('intro')) {
                switch (\Input::get('intro')) {
                    case 'best':
                        $intro = ' AND g.is_best = 1';
                        $intromode = 'best';
                        $ur_here = $_LANG['best_goods'];
                        break;
                    case 'new':
                        $intro = ' AND g.is_new = 1';
                        $intromode = 'new';
                        $ur_here = $_LANG['new_goods'];
                        break;
                    case 'hot':
                        $intro = ' AND g.is_hot = 1';
                        $intromode = 'hot';
                        $ur_here = $_LANG['hot_goods'];
                        break;
                    case 'promotion':
                        $time = gmtime();
                        $intro = " AND g.promote_price > 0 AND g.promote_start_date <= '$time' AND g.promote_end_date >= '$time'";
                        $intromode = 'promotion';
                        $ur_here = $_LANG['promotion_goods'];
                        break;
                    default:
                        $intro = '';
                }
            } else {
                $intro = '';
            }

            if (empty($ur_here)) {
                $ur_here = $_LANG['search_goods'];
            }

            /*------------------------------------------------------ */
            //-- 属性检索
            /*------------------------------------------------------ */
            $attr_in = '';
            $attr_num = 0;
            $attr_url = '';
            $attr_arg = array();

            if (\Input::get('attr')) {
                $sql = "SELECT goods_id, COUNT(*) AS num FROM " . $ecs->table("goods_attr") . " WHERE 0 ";
                foreach (\Input::get('attr') AS $key => $val) {
                    if (is_not_null($val) && is_numeric($key)) {
                        $attr_num++;
                        $sql .= " OR (1 ";

                        if (is_array($val)) {
                            $sql .= " AND attr_id = '$key'";

                            if (!empty($val['from'])) {
                                $sql .= is_numeric($val['from']) ? " AND attr_value >= " . floatval($val['from']) : " AND attr_value >= '$val[from]'";
                                $attr_arg["attr[$key][from]"] = $val['from'];
                                $attr_url .= "&amp;attr[$key][from]=$val[from]";
                            }

                            if (!empty($val['to'])) {
                                $sql .= is_numeric($val['to']) ? " AND attr_value <= " . floatval($val['to']) : " AND attr_value <= '$val[to]'";
                                $attr_arg["attr[$key][to]"] = $val['to'];
                                $attr_url .= "&amp;attr[$key][to]=$val[to]";
                            }
                        } else {
                            /* 处理选购中心过来的链接 */
                            $sql .= is_set(\Input::get('pickout')) ? " AND attr_id = '$key' AND attr_value = '" . $val . "' " : " AND attr_id = '$key' AND attr_value LIKE '%" . mysql_like_quote($val) . "%' ";
                            $attr_url .= "&amp;attr[$key]=$val";
                            $attr_arg["attr[$key]"] = $val;
                        }

                        $sql .= ')';
                    }
                }

                /* 如果检索条件都是无效的，就不用检索 */
                if ($attr_num > 0) {
                    $sql .= " GROUP BY goods_id HAVING num = '$attr_num'";

                    $row = $db->getCol($sql);
                    if (count($row)) {
                        $attr_in = " AND " . db_create_in($row, 'g.goods_id');
                    } else {
                        $attr_in = " AND 0 ";
                    }
                }
            } elseif (is_set(\Input::get('pickout'))) {
                /* 从选购中心进入的链接 */
                $sql = "SELECT DISTINCT(goods_id) FROM " . $ecs->table('goods_attr');
                $col = $db->getCol($sql);
                //如果商店没有设置商品属性,那么此检索条件是无效的
                if (!empty($col)) {
                    $attr_in = " AND " . db_create_in($col, 'g.goods_id');
                }
            }

            /* 获得符合条件的商品总数 */
            $sql = "SELECT COUNT(*) FROM " . $ecs->table('goods') . " AS g " .
                "WHERE g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 $attr_in " .
                "AND (( 1 " . $categories . $keywords . $brand . $min_price . $max_price . $intro . $outstock . " ) " . $tag_where . " )";
            $count = $db->getOne($sql);

            $max_page = ($count > 0) ? ceil($count / $size) : 1;
            if ($page > $max_page) {
                $page = $max_page;
            }

            /* 查询商品 */
            $sql = "SELECT g.goods_id, g.goods_name, g.market_price, g.is_new, g.is_best, g.is_hot, g.shop_price AS org_price, " .
                "IFNULL(mp.user_price, g.shop_price * '$_SESSION[discount]') AS shop_price, " .
                "g.promote_price, g.promote_start_date, g.promote_end_date, g.goods_thumb, g.goods_img, g.goods_brief, g.goods_type " .
                "FROM " . $ecs->table('goods') . " AS g " .
                "LEFT JOIN " . \ECS::table('member_price') . " AS mp " .
                "ON mp.goods_id = g.goods_id AND mp.user_rank = '$_SESSION[user_rank]' " .
                "WHERE g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 $attr_in " .
                "AND (( 1 " . $categories . $keywords . $brand . $min_price . $max_price . $intro . $outstock . " ) " . $tag_where . " ) " .
                "ORDER BY $sort $order";
            $res = $db->SelectLimit($sql, $size, ($page - 1) * $size);

            $arr = array();
            while ($row = $db->FetchRow($res)) {
                if ($row['promote_price'] > 0) {
                    $promote_price = bargain_price($row['promote_price'], $row['promote_start_date'], $row['promote_end_date']);
                } else {
                    $promote_price = 0;
                }

                /* 处理商品水印图片 */
                /* 处理商品水印图片 */
                $watermark_img = '';

                if ($promote_price != 0) {
                    $watermark_img = "watermark_promote_small";
                } elseif ($row['is_new'] != 0) {
                    $watermark_img = "watermark_new_small";
                } elseif ($row['is_best'] != 0) {
                    $watermark_img = "watermark_best_small";
                } elseif ($row['is_hot'] != 0) {
                    $watermark_img = 'watermark_hot_small';
                }

                if ($watermark_img != '') {
                    $arr[ $row['goods_id'] ]['watermark_img'] = $watermark_img;
                }

                $arr[ $row['goods_id'] ]['goods_id'] = $row['goods_id'];
                if ($display == 'grid') {
                    $arr[ $row['goods_id'] ]['goods_name'] = $GLOBALS['_CFG']['goods_name_length'] > 0 ? sub_str($row['goods_name'],
                        $GLOBALS['_CFG']['goods_name_length']) : $row['goods_name'];
                } else {
                    $arr[ $row['goods_id'] ]['goods_name'] = $row['goods_name'];
                }
                $arr[ $row['goods_id'] ]['type'] = $row['goods_type'];
                $arr[ $row['goods_id'] ]['market_price'] = price_format($row['market_price']);
                $arr[ $row['goods_id'] ]['shop_price'] = price_format($row['shop_price']);
                $arr[ $row['goods_id'] ]['promote_price'] = ($promote_price > 0) ? price_format($promote_price) : '';
                $arr[ $row['goods_id'] ]['goods_brief'] = $row['goods_brief'];
                $arr[ $row['goods_id'] ]['goods_thumb'] = get_image_path($row['goods_id'], $row['goods_thumb'], true);
                $arr[ $row['goods_id'] ]['goods_img'] = get_image_path($row['goods_id'], $row['goods_img']);
                $arr[ $row['goods_id'] ]['url'] = build_uri('goods', array('gid' => $row['goods_id']), $row['goods_name']);
            }

            if ($display == 'grid') {
                if (count($arr) % 2 != 0) {
                    $arr[] = array();
                }
            }
            \Tpl::assign('goods_list', $arr);
            \Tpl::assign('category', $category);
            \Tpl::assign('keywords', htmlspecialchars(stripslashes(\Input::get('keywords'))));
            \Tpl::assign('search_keywords', stripslashes(htmlspecialchars_decode(\Input::get('keywords'))));
            \Tpl::assign('brand', \Input::get('brand'));
            \Tpl::assign('min_price', $min_price);
            \Tpl::assign('max_price', $max_price);
            \Tpl::assign('outstock', \Input::get('outstock'));

            /* 分页 */
            $url_format = "search.php?category=$category&amp;keywords=" . urlencode(stripslashes(\Input::get('keywords'))) . "&amp;brand=" . \Input::get('brand') . "&amp;action=" . $action . "&amp;goods_type=" . \Input::get('goods_type') . "&amp;sc_ds=" . \Input::get('sc_ds');
            if (!empty($intromode)) {
                $url_format .= "&amp;intro=" . $intromode;
            }
            if (is_set(\Input::get('pickout'))) {
                $url_format .= '&amp;pickout=1';
            }
            $url_format .= "&amp;min_price=" . \Input::get('min_price') . "&amp;max_price=" . \Input::get('max_price') . "&amp;sort=$sort";

            $url_format .= "$attr_url&amp;order=$order&amp;page=";

            $pager['search'] = array(
                'keywords'   => stripslashes(urlencode(\Input::get('keywords'))),
                'category'   => $category,
                'brand'      => \Input::get('brand'),
                'sort'       => $sort,
                'order'      => $order,
                'min_price'  => \Input::get('min_price'),
                'max_price'  => \Input::get('max_price'),
                'action'     => $action,
                'intro'      => empty($intromode) ? '' : trim($intromode),
                'goods_type' => \Input::get('goods_type'),
                'sc_ds'      => \Input::get('sc_ds'),
                'outstock'   => \Input::get('outstock')
            );
            $pager['search'] = array_merge($pager['search'], $attr_arg);

            $pager = get_pager('search.php', $pager['search'], $count, $page, $size);
            $pager['display'] = $display;

            \Tpl::assign('url_format', $url_format);
            \Tpl::assign('pager', $pager);

            assign_template();
            assign_dynamic('search');
            $position = assign_ur_here(0, $ur_here . (\Input::get('keywords') ? '_' . \Input::get('keywords') : ''));
            \Tpl::assign('page_title', $position['title']);    // 页面标题
            \Tpl::assign('ur_here', $position['ur_here']);  // 当前位置
            \Tpl::assign('intromode', $intromode);
            \Tpl::assign('categories', get_categories_tree()); // 分类树
            \Tpl::assign('helps', get_shop_help());      // 网店帮助
            \Tpl::assign('top_goods', get_top10());           // 销售排行
            \Tpl::assign('promotion_info', get_promotion_info());

            \Tpl::display('search.dwt');
        }


        return view('shop::index');
	}
	
}


/*------------------------------------------------------ */
//-- PRIVATE FUNCTION
/*------------------------------------------------------ */
/**
 *
 *
 * @access public
 * @param
 *
 * @return void
 */
/**
 * @param $value
 * @return bool
 */
function is_not_null($value)
{
    if (is_array($value)) {
        return (!empty($value['from'])) || (!empty($value['to']));
    } else {
        return !empty($value);
    }
}

/**
 * 获得可以检索的属性
 *
 * @access  public
 * @params  integer $cat_id
 * @return  void
 */
/**
 * @param int $cat_id
 * @return array
 */
function get_seachable_attributes($cat_id = 0)
{
    $attributes = array(
        'cate' => array(),
        'attr' => array()
    );

    /* 获得可用的商品类型 */
    $sql = "SELECT t.cat_id, cat_name FROM " . \ECS::table('goods_type') . " AS t, " .
        \ECS::table('attribute') . " AS a" .
        " WHERE t.cat_id = a.cat_id AND t.enabled = 1 AND a.attr_index > 0 ";
    $cat = \Ecdb::getAll($sql);

    /* 获取可以检索的属性 */
    if (!empty($cat)) {
        foreach ($cat AS $val) {
            $attributes['cate'][ $val['cat_id'] ] = $val['cat_name'];
        }
        $where = $cat_id > 0 ? ' AND a.cat_id = ' . $cat_id : " AND a.cat_id = " . $cat[0]['cat_id'];

        $sql = 'SELECT attr_id, attr_name, attr_input_type, attr_type, attr_values, attr_index, sort_order ' .
            ' FROM ' . \ECS::table('attribute') . ' AS a ' .
            ' WHERE a.attr_index > 0 ' . $where .
            ' ORDER BY cat_id, sort_order ASC';
        $res = \Ecdb::query($sql);

        while ($row = \Ecdb::FetchRow($res)) {
            if ($row['attr_index'] == 1 && $row['attr_input_type'] == 1) {
                $row['attr_values'] = str_replace("\r", '', $row['attr_values']);
                $options = explode("\n", $row['attr_values']);

                $attr_value = array();
                foreach ($options AS $opt) {
                    $attr_value[ $opt ] = $opt;
                }
                $attributes['attr'][] = array(
                    'id'      => $row['attr_id'],
                    'attr'    => $row['attr_name'],
                    'options' => $attr_value,
                    'type'    => 3
                );
            } else {
                $attributes['attr'][] = array(
                    'id'   => $row['attr_id'],
                    'attr' => $row['attr_name'],
                    'type' => $row['attr_index']
                );
            }
        }
    }

    return $attributes;
}
